import 'dart:math';

import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hockey/extensions/jzx_json_extension.dart';

import 'jzx_author_data.dart';

part 'jzx_media_data.freezed.dart';
part 'jzx_media_data.g.dart';

@freezed
class AuthtorUserBind with _$AuthtorUserBind {
  const factory AuthtorUserBind({
    /// 作者 ABCD...
    @Default('') String author,

    /// 作者绑定的用户uid
    @Default('') String userId,

    /// 0 图片 1 视频
    @Default(0) num type,
  }) = _AuthtorUserBind;
  factory AuthtorUserBind.fromJson(Map<String, Object?> json) =>
      _$AuthtorUserBindFromJson(json);
}

@freezed
class JzxMediaData with _$JzxMediaData {
  const factory JzxMediaData({
    /// 标识
    @JzxJsonAlwaysNum() @Default(0) num id,

    /// follow
    @JzxJsonAlwaysNum() @Default(0) num follow,
    @Default(false) bool isFollowed,

    /// praise
    @JzxJsonAlwaysNum() @Default(0) num like,
    @Default(false) bool isLiked,

    /// 关联绑定网络数据的用户uid
    // @JzxJsonAlwaysString() @Default('') String bindingUser,

    /// 作者 ABCD...
    @JzxJsonAlwaysString() @Default('') String author,

    /// 标题
    @JzxJsonAlwaysString() @Default('') String title,

    /// 文本内容
    @JzxJsonAlwaysString() @Default('') String content,

    /// 封面
    @JzxJsonAlwaysString() @Default('') String cover,

    /// 资源链接 多格拼接
    @JzxJsonAlwaysString() @Default('') String url,

    /// 0 图片 1 视频
    @JzxJsonAlwaysNum() @Default(0) num type,

    /// 用户数据
    @Default(JzxAuthorData()) JzxAuthorData user,
  }) = _JzxMediaData;
  factory JzxMediaData.fromJson(Map<String, Object?> json) =>
      _$JzxMediaDataFromJson(json);
}

extension JzxMediaDataExt on JzxMediaData {
  List<String> get nameList => url.isEmpty ? [] : url.split(',');
  // List<String> get images => nameList.map((e) => 'assets/post/$e.jpg').toList();

  /// 所有的图片
  List<String> get images => [
        cover.length < 20 ? 'assets/post/$cover.jpg' : cover,
        ...nameList.map((e) {
          if (e.length < 20) {
            return 'assets/post/$e.jpg';
          }
          return e;
        }).toList()
      ];
}

extension NumExt on num {
  // 格式化字符
  String get format {
    if (this < 1000) {
      return toString();
    }
    return '${(this / 1000).toStringAsFixed(1)}K';
  }

  // 格式化字符
  int get levelFormat {
    return min(5, max(1, toInt()));
  }
}
